# 常用第三方模块
# chardet
# Python提供了Unicode表示的str和bytes两种数据类型，并且可以通过encode()和decode()方法转换，但是，在不知道编码的情况下，对bytes做decode()不好做。对于未知编码的bytes，要把它转换成str，需要先“猜测”编码。猜测的方式是先收集各种编码的特征字符，根据特征字符判断，就能有很大概率“猜对”。当然，我们肯定不能从头自己写这个检测编码的功能，这样做费时费力。chardet这个第三方库正好就派上了用场。
# chardet：用它来检测编码，简单易用。
# 安装chardet：如果安装了Anaconda，chardet就已经可用了。否则，需要在命令行下通过pip安装：$ pip install chardet
# 使用chardet：当我们拿到一个bytes时，就可以对其检测编码。用chardet检测编码，只需要一行代码：
import chardet
print(chardet.detect(b'Hello,word!'))
# 检测出的编码是ascii，注意到还有个confidence字段，表示检测的概率是1.0（即100%）
data = '文思问文斯什么是纹丝，文斯不知道什么是闻思'.encode('gbk')
print(chardet.detect(data))
data = '文思问文斯什么是纹丝，文斯不知道什么是闻思'.encode('utf-8')
print(chardet.detect(data))
data = '最新の主要ニュース'.encode('euc-jp')
print(chardet.detect(data))
# 可见，用chardet检测编码，使用简单。获取到编码后，再转换为str，就可以方便后续处理。chardet支持检测的编码列表请参考官方文档https://chardet.readthedocs.io/en/latest/supported-encodings.html


# 常用第三方模块
# psutil
# psutil = process and system utilities，它不仅可以通过一两行代码实现系统监控，还可以跨平台使用，支持Linux／UNIX／OSX／Windows等，是系统管理员和运维小伙伴不可或缺的必备模块。
# 安装psutil：如果安装了Anaconda，psutil就已经可用了。否则，需要在命令行下通过pip安装：$ pip install psutil
# 获取CPU信息：
import psutil
print(psutil.cpu_count()) # CPU逻辑数量
print(psutil.cpu_count(logical=False))# CPU物理核心，2说明是双核超线程, 4则是4核非超线程
# 统计CPU的用户／系统／空闲时间：
print(psutil.cpu_times())
# 再实现类似top命令的CPU使用率，每秒刷新一次，累计3次：
for x in range(3):
    print(psutil.cpu_percent(interval=1,percpu=True))

# 获取内存信息：
# 使用psutil获取物理内存和交换内存信息，分别使用：
print(psutil.virtual_memory())
print(psutil.swap_memory())
# 返回的是字节为单位的整数，可以看到，总内存大小是17037275136 = 16 GB，已用7768309760，使用了45.596%。
# 而交换区大小是25658396672

# 获取磁盘信息：
# 可以通过psutil获取磁盘分区、磁盘使用率和磁盘IO信息：
print(psutil.disk_partitions()) # 磁盘分区信息
print(psutil.disk_usage('/')) # 磁盘使用情况
print(psutil.disk_io_counters()) # 磁盘IO
# 可以看到，磁盘'/'的总容量是580771639296，使用了7.6%。文件格式是NTFS，opts中包含rw表示可读写，journaled表示支持日志。

# 获取网络信息：
# psutil可以获取网络接口和网络连接信息：
print(psutil.net_io_counters())  # 获取网络读写字节／包的个数
print(psutil.net_if_addrs()) # 获取网络接口信息
print(psutil.net_if_stats()) # 获取网络接口状态
# 要获取当前网络连接信息，使用net_connections()：
print(psutil.net_connections())

# 获取进程信息：
print(psutil.pids()) # 所有进程ID
p = psutil.Process(2476) # 获取指定进程ID=2476，其实就是Code.exe
print(p.name()) # 进程名称
print(p.exe()) # 进程exe路径
# print(p.cwd()) # 进程工作目录
print(p.cmdline()) # 进程启动的命令行
print(p.ppid()) # 父进程ID
print(p.parent())# 父进程
print(p.children()) # 子进程列表
print(p.status()) # 进程状态
#print(p.username()) # 进程用户名
print(p.create_time()) # 进程创建时间
#print(p.terminal()) # 进程终端
print(p.cpu_times()) # 进程使用的CPU时间
print(p.memory_info()) # 进程使用的内存
#print(p.open_files()) # 进程打开的文件
print(p.connections()) # 进程相关网络连接
print(p.num_threads()) # 进程的线程数量
print(p.threads()) # 所有线程信息
#print(p.environ()) # 进程环境变量
#print(p.terminate()) # 结束进程
# psutil还提供了一个test()函数，可以模拟出ps命令的效果：
print(psutil.test())






